package Lock;
  //获取当前jvm能使用到的cpu数量
  //int num= Runtime.getRuntime().availableProcessors();
  //System.out.println(num);

/**锁-->线程同步
 * 是为了防止多个线程访问一个数据对象时，对数据造成的破坏线程同步
 * 其实就是排队，然后一个一个对共享资源进行操作
 * 而不是同时进行操作I只有共享资源的读写访问才需要同步
 */

public class Demo implements Runnable {
    private int ticket=100;

    //共享数据的类中，需要准备一个共享的锁...
    private final Object lock=new Object();

    public static void main(String[] args) {
     Runnable runnable=new Demo();
     Thread T1=new Thread(runnable,"A");
     T1.start();
     Thread T2=new Thread(runnable,"B");
     T2.start();

    }

    @Override
    public void run() {
    //获取当前正在运动的方法线程
    Thread thread=Thread.currentThread();//获取当前正在执行的线程名称
    String name=thread.getName();
        while (this.ticket>0){
            //上锁 synchronized
            //当前得到CPU使用权的线程为lock上锁，此时别的线程得到CPU使用权，发现对象已上锁，其他对象就必须等待lock释放
            synchronized (this.lock){
             this.ticket--;
             System.out.println(name+"销售了一张车票！余票："+this.ticket);
            }


            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            //当同步代码块中的代码执行后，会自动释放lock对象锁
        }
    }


}
